package com.exonline.front.controller.shoppingcart;

import com.exonline.commons.dao.DaoImpl;
import com.exonline.commons.dao.IDao;
import com.exonline.commons.entity.ShoppingCart;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * @desc 购物车业务M层
 * @author: hbrj
 */
public class ShoppingService {

    IDao<ShoppingCart>  ShoppingCartDao = new DaoImpl<>();

    /**
     * @desc  1. 添加课程到购物车
     * @author hbrj
     * @param sid 学生id
     * @param cid 课程id
     * @param id 购物车id
     * @throws SQLException 如果数据库操作出现错误
     */
    public boolean addCourseToShoppingCart( String id,String sid, String cid) throws SQLException {
        // 1.1 判断课程是否已在购物车中
        if (isCourseInShoppingCart(sid, cid)) {
            // 已存在，直接返回添加失败
            return false;
        }
        String sql = "INSERT INTO shoppingcart (id, sid, cid) VALUES (?,?,?)";
        // 1.2 执行添加操作
        ShoppingCartDao.updateWithTransaction(sql, id, sid, cid);
        return true;
    }
    /**
     * @desc  1.2 判断课程是否已在购物车中
     */
    private boolean isCourseInShoppingCart(String sid, String cid) {
        String checkSql = "SELECT COUNT(*) FROM shoppingcart WHERE sid =? AND cid =?";
        try {
            // 通过执行查询语句，获取符合条件的记录数量
            Long count = ShoppingCartDao.queryForObject(checkSql, new ScalarHandler<Long>(), sid, cid);
            return count!= null && count > 0;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * @desc  2. 删除购物车中的课程
     * @author hbrj
     * @param sid 学生id
     * @param cid 课程id
     */
    public boolean deleteCourseFromShoppingCart(String sid, String cid) {
        // 1. 删除指定学生和课程的购物车记录
        String deleteSql = "DELETE FROM shoppingcart WHERE sid =? AND cid =?";
        try {
            ShoppingCartDao.updateWithTransaction(deleteSql, sid, cid);
            return true;
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }
    }


    /**
     * @desc 3. 查询指定学生购物车中的课程详细信息列表（包含课程表中的cname、cintroduce、cprice、cover等信息）
     * @param sid 学生的ID
     * @return 购物车中课程详细信息列表（以Map形式表示每条课程记录，包含课程相关字段信息）
     */
    public List<Map<String, Object>> queryShoppingCartCourses(String sid) {
        // 查询语句
        String sql = "SELECT c.cname, c.cintroduce, c.cprice, c.cover,c.id " + "FROM shoppingcart sc " + "JOIN courses c ON sc.cid = c.id " + "WHERE sc.sid =?";
        try {
            // 执行查询操作，返回结果
            return ShoppingCartDao.queryWithPagingAndConditions(sql, null, 1, 10000, new MapListHandler(), sid);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
}
